package com.czy.facecompare.controller;

import com.czy.facecompare.service.FaceCompare;
import org.opencv.core.CvException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Part;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

@RestController
public class WebFaceCompare {

    // 创建人脸识别对象
    @Autowired
    private FaceCompare faceCompare;

    @PostMapping("/facecompare")
    public ResponseEntity<Map<String,Object>> faceCompare(Part file1, Part file2) {

        // 定义结果map对象
        Map<String,Object> map = new HashMap<>();
        // 图片1,2的文件名
        String image1 = "";
        String image2 = "";


        // 取文件扩展名
        String fileExt1 = file1.getSubmittedFileName().split("[.]")[1];
        String fileExt2 = file2.getSubmittedFileName().split("[.]")[1];
        // 取反文件扩展名不是jpg也不是png更不是jpeg
        if (!fileExt1.equalsIgnoreCase("jpg")) {
            // 定义输出错误结果
            map.put("message","你上传的第一张不是图片");
            map.put("code",400);
            // 返回响应信息请求被拒绝 请求码400
            return new ResponseEntity<Map<String,Object>>(map, HttpStatus.BAD_REQUEST);
        }

        // 取反文件扩展名不是jpg也不是png更不是jpeg
        if (!fileExt2.equalsIgnoreCase("jpg")){

            // 定义输出错误结果
            map.put("message","你上传的第二张不是图片");
            map.put("code",400);
            // 返回响应信息请求被拒绝 请求码400
            return new ResponseEntity<Map<String,Object>>(map, HttpStatus.BAD_REQUEST);
        }

        String AbsolutePath = "D:\\face\\";

        File file = null;

        try{
            // 判断文件夹路径是否存在,不存在则创建
            file = new File(AbsolutePath);
            if(!file.exists()){
                file.mkdirs();
            }
            // 获取图片全路径
            image1 = AbsolutePath + file1.getSubmittedFileName();
            image2 = AbsolutePath + file2.getSubmittedFileName();

            // 写入图片
            file1.write(image1);
            file2.write(image2);
        }catch (Exception e) {
            // 填充响应数据
            map.put("message","图片上传异常");
            map.put("code",500);
            map.put("Exception",e.getMessage());
            e.printStackTrace();
            // 图片上传异常响应
            return new ResponseEntity<Map<String,Object>>(map,HttpStatus.INTERNAL_SERVER_ERROR);
        }

        // 相识度值
        double compareHist = 0;
        try{
            // 检测两张图片相识度                          //accuracy 越大匹配越精确 (越慢) 10000000
            compareHist = faceCompare.compare_image(image1, image2,10000000);
            System.out.println(compareHist);
        } catch (CvException e) {
            // 填充响应数据
            map.put("message","图片上传异常");
            map.put("code",500);
            map.put("Exception",e.getMessage());
            e.printStackTrace();
            // 图片上传异常响应
            return new ResponseEntity<Map<String,Object>>(map,HttpStatus.INTERNAL_SERVER_ERROR);
        }

        // 0.5相识度阈值 可进行调整 1.0-0.1之间 值越大相识度越高
        if (compareHist > 0.5) {
            // 匹配上
            map.put("compareHist",compareHist);
            map.put("message","人脸匹配");
            System.out.println("人脸匹配");
        } else {
            // 没有匹配上
            map.put("compareHist",compareHist);
            map.put("message","人脸不匹配");
            System.out.println("人脸不匹配");
        }

        // 删除临时上传的目录
        clearDir(file,AbsolutePath);

        // 成功响应数据
        return new ResponseEntity<Map<String,Object>>(map, HttpStatus.OK);
    }


    /**
     *  调用百度AI人脸对比
     * @param file1
     * @param file2
     * @return
     */
    @PostMapping("/baidu/facecompare")
    public ResponseEntity<Map<String,Object>> baiduFaceCompare(Part file1, Part file2) {

        // 定义结果map对象
        Map<String,Object> map = new HashMap<>();
        // 图片1,2的文件名
        String image1 = "";
        String image2 = "";


        // 取文件扩展名
        String fileExt1 = file1.getSubmittedFileName().split("[.]")[1];
        String fileExt2 = file2.getSubmittedFileName().split("[.]")[1];
        // 取反文件扩展名不是jpg也不是png更不是jpeg
        if (!fileExt1.equalsIgnoreCase("jpg")) {
            // 定义输出错误结果
            map.put("message","你上传的第一张不是图片");
            map.put("code",400);
            // 返回响应信息请求被拒绝 请求码400
            return new ResponseEntity<Map<String,Object>>(map, HttpStatus.BAD_REQUEST);
        }

        // 取反文件扩展名不是jpg也不是png更不是jpeg
        if (!fileExt2.equalsIgnoreCase("jpg")){

            // 定义输出错误结果
            map.put("message","你上传的第二张不是图片");
            map.put("code",400);
            // 返回响应信息请求被拒绝 请求码400
            return new ResponseEntity<Map<String,Object>>(map, HttpStatus.BAD_REQUEST);
        }

        String AbsolutePath = "D:\\face\\";

        File file = null;

        try{
            // 判断文件夹路径是否存在,不存在则创建
            file = new File(AbsolutePath);
            if(!file.exists()){
                file.mkdirs();
            }
            // 获取图片全路径
            image1 = AbsolutePath + file1.getSubmittedFileName();
            image2 = AbsolutePath + file2.getSubmittedFileName();

            // 写入图片
            file1.write(image1);
            file2.write(image2);
        }catch (Exception e) {
            // 填充响应数据
            map.put("message","图片上传异常");
            map.put("code",500);
            map.put("Exception",e.getMessage());
            e.printStackTrace();
            // 图片上传异常响应
            return new ResponseEntity<Map<String,Object>>(map,HttpStatus.INTERNAL_SERVER_ERROR);
        }

        // 此处添加业务逻辑

        // 删除临时上传的目录
        clearDir(file,AbsolutePath);

        // 成功响应数据
        return new ResponseEntity<Map<String,Object>>(map, HttpStatus.OK);
    }


    // 删除临时上传的目录内的图片
    private Boolean clearDir(File file,String path){

        // 取得当前目录下所有文件和文件夹
        String[] content = file.list();
        for(String name : content){
            File temp = new File(path, name);
            // 直接删除文件
            if(!temp.delete()){
                System.err.println("Failed to delete " + name);
            }
        }
        return true;
    }
}
